import json

import requests

from utils.log import logger


class BaseApi:

    def __init__(self, base_url, role=None):
        self.base_url = base_url
        # 获取对应的角色信息
        if role:
            self.role = role


    def __set_token(self, request_infos):
        """
               # 问题： 除登录接口之外，基本每一个接口，都需要另外去设置token
               # 解决方案：
                   1. 在发起接口请求之前，就获取token信息
                   2. 获取token信息之后，塞入到请求信息之中
                       1. 除了method 和url 之外，所有的其他信息，包括header params 等等的其他参数，都会塞入至kwargs 不定长参数中
                       cart_api -> send-> 获取kwargs -> 在kwargs 中 塞入header（鉴权）信息
               # 问题2: 如果有两个token存在怎么办？
               # 1. 不同的角色有不同的token信息

               :return:
               """
        admin_url = "admin/auth/login"
        admin_parm = {'code': "",
                      'password': "test12345",
                      'username': "hogwarts"
                      }
        admin_r = requests.request("post", self.base_url+admin_url, json=admin_parm)

        # self.token = admin_r.json()["data"]["token"]
        self.token = {"x-litemall-admin-token": admin_r.json()["data"]["token"]}

        wx_url = "wx/auth/login"
        wx_parm = {
            'password': 'user123',
            'username': 'user123'
        }
        wx_r = requests.request("post", self.base_url+wx_url, json=wx_parm)
        # self.wx_token = wx_r.json()["data"]["token"]
        self.wx_token = {"x-litemall-token": wx_r.json()["data"]["token"]}

        # 如果是admin，那么就塞入admin的token
        # 如果是其他，那么就塞入 其他的token
        if self.role == "admin":
            self.final_token = self.token
        else:
            self.final_token = self.wx_token
        # 获取headers， 如果请求本身有头信息，那么就把token信息更新进去
        if request_infos.get("headers"):
            request_infos["headers"].update(self.final_token)
        else:
            request_infos["headers"] = self.final_token
        return request_infos

    def send(self, method, url, **kwargs):
        # 问题1： 接口里面直接使用了requests
        # 解决方案： 在base_api中添加公共的send方法
        # 问题2：大量重复的base_url
        # 解决方案，在构造函数，实例化base_url，并且在send方法，就直接做拼接，这样子类的方法，就无需重复编写self.base_url
        # 优化3： token 的获取也放到了构造函数里面

        kwargs = self.__set_token(kwargs)
        r = requests.request(method, self.base_url+url, **kwargs)
        logger.info(f"{url}:接口信息为{json.dumps(r.json(), indent=2, ensure_ascii=False)}")
        return r.json()
